์ž‘์„ฑ: 2026-03-04 04:03:38์ˆ˜์ •: 2026-03-04 04:03:38

Spring Boot ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™: Spring Data JPA ํ™œ์šฉํ•˜๊ธฐ

์ž๋ฐ” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™์€ ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. Spring Data JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ SQL ์ฟผ๋ฆฌ ์ž‘์„ฑ ์—†์ด๋„ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 2026๋…„ ๊ธฐ์ค€ ์‹ค๋ฌด์—์„œ ๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ์—ฐ๋™ ๋ฐฉ์‹์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


1. ์˜์กด์„ฑ ์ถ”๊ฐ€ (Dependencies)

Maven (pom.xml)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

Gradle (build.gradle)

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'com.h2database:h2'
}

2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ • (application.properties)

DB ์ ‘์† ์ •๋ณด๋ฅผ ์„ค์ • ํŒŒ์ผ์— ๊ธฐ์ž…ํ•ฉ๋‹ˆ๋‹ค.

# H2 ์ธ๋ฉ”๋ชจ๋ฆฌ DB ์„ค์ • ์˜ˆ์‹œ
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
 
# JPA ์ƒ์„ธ ์„ค์ •
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

3. ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ

โ‘  ์—”ํ‹ฐํ‹ฐ (Entity)

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋  ์ž๋ฐ” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

@Entity
@Getter @Setter
public class User {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(nullable = false)
    private String name;
    
    private String email;
}

โ‘ก ๋ฆฌํฌ์ง€ํ† ๋ฆฌ (Repository)

์ธํ„ฐํŽ˜์ด์Šค ์„ ์–ธ๋งŒ์œผ๋กœ ๊ธฐ๋ณธ์ ์ธ CRUD ๊ธฐ๋Šฅ์„ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค.

public interface UserRepository extends JpaRepository<User, Long> {
    // ๋ฉ”์†Œ๋“œ ์ด๋ฆ„๋งŒ์œผ๋กœ ์ฟผ๋ฆฌ ์ƒ์„ฑ ๊ฐ€๋Šฅ
    Optional<User> findByEmail(String email);
}

4. ์„œ๋น„์Šค ๋ ˆ์ด์–ด์—์„œ์˜ ์‚ฌ์šฉ

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ @Service ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•˜๋ฉฐ, @Transactional ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

@Service
@RequiredArgsConstructor
public class UserService {
    private final UserRepository userRepository;
 
    @Transactional
    public Long join(User user) {
        userRepository.save(user);
        return user.getId();
    }
}

5. ์š”์•ฝ ๋ฐ ์ฃผ์˜์‚ฌํ•ญ

  1. N+1 ๋ฌธ์ œ: ์—ฐ๊ด€ ๊ด€๊ณ„ ์กฐํšŒ ์‹œ ๋ถˆํ•„์š”ํ•œ ์ฟผ๋ฆฌ๊ฐ€ ๋งŽ์ด ๋‚˜๊ฐ€๋Š” ํ˜„์ƒ์„ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (Fetch Join ๋“ฑ์œผ๋กœ ํ•ด๊ฒฐ)
  2. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ: JPA๊ฐ€ ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ DB์— ๋ฐ˜์˜ํ•˜๋Š” ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. DB ๋…๋ฆฝ์„ฑ: Spring Data JPA๋ฅผ ์“ฐ๋ฉด ์ฝ”๋“œ๋Š” ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ์„ค์ •๋งŒ ๋ฐ”๊ฟ”์„œ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ DB๋กœ ์‰ฝ๊ฒŒ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๋ณต์žกํ•œ JDBC ์ฝ”๋“œ ๋Œ€์‹  JPA๋กœ ๊น”๋”ํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ด€๋ฆฌํ•ด ๋ณด์„ธ์š”!